#include <iostream>

using namespace std;

/*
    指针和引用主要有以下区别：

        1. 引用必须被初始化，但是不分配存储空间。指针不声明时初始化，在初始化的时候需要分配存储空间。
        2. 引用初始化后不能被改变，指针可以改变所指的对象。
        3. 不存在指向空值的引用，但是存在指向空值的指针。

*/

/*
    引用做参数和返回值
        1. 引用做参数： 在函数调用时，函数接收的是参数的引用，不会触发参数的的拷贝动作，效率高，但是对参数的修改会直接作用与原始值。提高了函数调用的运行效率
        2. 引用做返回值：   (1) 以引用返回函数值，定义函数时需要在函数名前加&
                            (2) 用引用返回一个函数值的最大好处是，在内存中不产生被返回值的副本。
                            (3) 不能返回局部变量的引用  原因是局部变量会在函数返回后被销毁，因此被返回的引用就成为了"无所指"的引用，程序会进入未知状态。
                            (4) 不能返回函数内部new分配的内存的引用: 虽然不存在局部变量的被动销毁问题，但是会遇到 被函数返回的引用只是作为一 个临时变量出现，
                                                                而没有被赋予一个实际的变量，那么这个引用所指向的空间（由new分配）就无法释放，造成memory leak
*/

/*
    指针做参数和返回值
        1. 指针做参数： 在函数调用的时候，会触发一次参数的拷贝动作，而且传入的是指针，如果解引用指针，会修改原始值
        2. 指针做返回值：返回的指针所指向的数据不能够是函数内声明的变量
*/

// 1. 引用做参数
void Swap(int &left, int &right)
{ //做参数，省去指针的拷贝一步
    int temp = left;
    left = right;
    right = temp;
}

// 2. 引用做返回值
int &Count() //引用返回，返回的是n的别名
{
    static int n = 0; //static修饰，使n的作用域存在于全局
    // int n = 0;   如果是这样的n定义的就不能使用引用做返回值
    n++;

    return n; //当n是局部变量时，出作用域会被销毁，如果再去返回n的别名，相当于出现了野指针
}

int SCount() //引用返回，返回的是n的别名
{
    static int n = 0;
    n++;

    return n; // 传值返回,这里系统会生成一个临时变量，做返回值
}

int main()
{
}